package com.qding.park.common.core.network;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import com.qding.park.common.core.exceptions.ExceptionMessage;
import com.qding.park.common.core.exceptions.system.NetWorkException;

/**
 * @ClassName HttpUtil
 * @Description TODO(http 协议工具类)
 * @author Administrator
 * @Date 2016年8月31日 下午6:58:58
 * @version 1.0.0
 */
public class HttpUtil {

	/**
	 * @Description (http post 方法)
	 * @param url
	 * @param params
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 * @throws NetWorkException
	 */
	public static String doPost(String url, Map<String,String> params)
			throws ClientProtocolException, IOException, NetWorkException {
		
		CloseableHttpClient httpclient = HttpClients.createDefault();
		HttpPost httpPost = new HttpPost(url);
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();

		for (Map.Entry<String, String> entry : params.entrySet()) {
			nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
		}
		httpPost.addHeader("Content-type","application/x-www-form-urlencoded");  
//		httpPost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");  
//		httpPost.setEntity(new StringEntity(params, Charset.forName("UTF-8")));
		httpPost.setEntity(new UrlEncodedFormEntity(nvps,Charset.forName("UTF-8")));
		CloseableHttpResponse response = httpclient.execute(httpPost);

		try {
			System.out.println(response.getStatusLine());

			int statusCode = response.getStatusLine().getStatusCode();
			HttpEntity entity = response.getEntity();
			String result = EntityUtils.toString(entity);
//			System.out.println( EntityUtils.toString(entity));
//			System.out.println( result);
			if (200 == statusCode) {
//				System.out.println( result);
				return result;
			} else {
				System.out.println( result);
				throw new NetWorkException(NetWorkException.TypeEnum.EXCEPTION_NETWORK.getId(), null,
						new ExceptionMessage(NetWorkException.TypeEnum.EXCEPTION_NETWORK.getDesc(), " 网络通信息异常",
								url + "  返回非200"));
			}
		} finally {
			response.close();
		}

	}
	
	
	public static void natPost(String actionUrl, Map<String, String> params, Map<String, File> files) throws IOException
    {

        String BOUNDARY = java.util.UUID.randomUUID().toString();
        String PREFIX = "--", LINEND = "\r\n";
        String MULTIPART_FROM_DATA = "application/x-www-form-urlencoded";
        String CHARSET = "UTF-8";

        URL uri = new URL(actionUrl);
        HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
        conn.setReadTimeout(10 * 1000); // 缓存的最长时间
        conn.setDoInput(true);// 允许输入
        conn.setDoOutput(true);// 允许输出
        conn.setUseCaches(false); // 不允许使用缓存
        conn.setRequestMethod("POST");
        conn.setRequestProperty("connection", "keep-alive");
//        conn.setRequestProperty("clientId", "194003894599982");
        conn.setRequestProperty("Charsert", "UTF-8");
        conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
        
        // 首先组拼文本类型的参数
        StringBuilder sb = new StringBuilder();
        sb.append("clientID=207&cardCode=19&plateNo=粤B12345&flag=1&payMos=1");
//        for (Map.Entry<String, String> entry : params.entrySet())
//        {
//            sb.append(PREFIX);
//            sb.append(BOUNDARY);
//            sb.append(LINEND);
//            sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
//            sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
//            sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
//            sb.append(LINEND);
//            sb.append(entry.getValue());
//            sb.append(LINEND);
//        }

        DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
        outStream.write(sb.toString().getBytes());
        InputStream in = null;
        // 发送文件数据
        if (files != null)
        {
            for (Map.Entry<String, File> file : files.entrySet())
            {
                StringBuilder sb1 = new StringBuilder();
                sb1.append(PREFIX);
                sb1.append(BOUNDARY);
                sb1.append(LINEND);
                // name是post中传参的键 filename是文件的名称
                sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getKey() + "\"" + LINEND);
                sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);
                sb1.append(LINEND);
                outStream.write(sb1.toString().getBytes());

                InputStream is = new FileInputStream(file.getValue());
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = is.read(buffer)) != -1)
                {
                    outStream.write(buffer, 0, len);
                }

                is.close();
                outStream.write(LINEND.getBytes());
            }
        }
        System.out.println("发送字符串::"+sb.toString());
            // 请求结束标志
            byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
            outStream.write(end_data);
            outStream.flush();
            // 得到响应码
            int res = conn.getResponseCode();
            if (res == 200)
            {
                in = conn.getInputStream();
                int ch;
                StringBuilder sb2 = new StringBuilder();
                while ((ch = in.read()) != -1)
                {
                    sb2.append((char) ch);
                }
                
                System.out.println("返回:"+URLDecoder.decode(sb2.toString()));
            }
            outStream.close();
            conn.disconnect();
//        }
        // return in.toString();
    }

}
